package pl.edu.project.view;

import java.awt.Color;
import java.awt.Component;
import java.awt.FlowLayout;
import java.awt.Font;
import java.text.NumberFormat;
import java.util.Calendar;

import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JList;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;

import org.freixas.jcalendar.JCalendar;

import pl.edu.project.model.Event;
import pl.edu.project.model.EventsList;

/**
 * Klasa g��wna warstwy interfejsu projektu, zawiera statyczn� metod� main. Jest
 * odpowiedzialna za g��wne okno aplikacji
 */
@SuppressWarnings("serial")
public class CalendarFrame extends JPanel {
    /**
     * Pole reprezentuj�ce pozycj� "O programie" w menu
     */
    private JMenuItem about;

    /**
     * Pole reprezentuj�ce przycisk dodaj�cy zdarzenie "Dodaj"
     */
    private JButton addEvent;

    /**
     * Pole reprezentuj�ce kalendarz wykorzystywany w aplikacji
     */
    private JCalendar calendar;

    /**
     * Pole przechowuj�ce informacj� czy ustawiony jest alarm d�wi�kowy
     */
    public boolean coolAlarm;

    /**
     * Pole reprezentuj�ce przycisk usuwaj�cy zdarzenie "Usu�"
     */
    private JButton delEvent;

    /**
     * Pole reprezentuj�ce przycisk edytuj�cy zdarzenie "Edytuj"
     */
    private JButton editEvent;

    /**
     * Pole reprezentuj�ce list� zdarze�
     */
    private JList eventList;

    /**
     * Pole reprezentuj�ce model listy zdarze�
     */
    private DefaultListModel eventListModel;

    /**
     * Pole reprezentuj�ce pozycj� "Exit" w menu
     */
    private JMenuItem exit;

    /**
     * Pole reprezentuj�ce pozycj� "Eksportuj" w narz�dziach
     */
    private JMenuItem exportEvents;

    /**
     * Pole reprezentuj�ce pozycj� "Filtruj" w narz�dziach
     */
    private JMenuItem filterEvents;

    /**
     * Pole reprezentuj�ce pozycj� "Importuj" w narz�dziach
     */
    private JMenuItem importEvents;

    /**
     * Pole przechowuj�ce list� zdarze�
     */
    private EventsList listReference;

    /**
     * Pole reprezentuj�ce list� rozwijan� menu "Menu"
     */
    private JMenu menu;

    /**
     * Pole reprezentuj�ce pasek menu rozwijanego
     */
    private JMenuBar menuBar;

    /**
     * Pole reprezentuj�ce wybran� dat�
     */
    private Calendar selectedDate;

    /**
     * Pole reprezentuj�ce pozcyj� "Ustawienia" w menu
     */
    private JMenuItem settings;

    /**
     * Pole reprezentuj�ce list� rozwijan� narz�dzi "Narz�dzia"
     */
    private JMenu tools;

    public CalendarFrame(Component calendarEventsFrame) {
	super(new FlowLayout());
	init(calendarEventsFrame);

    }

    /**
     * Metoda pobieraj�ca zdarzenie z kolekcji zdarze� i dodaj�ca zdarzenie do
     * wy�wietlanje listy zdarze�
     */
    public void getEvents() {
	eventListModel.clear();
	int n = listReference.getEventsAmount(selectedDate);
	for (int i = 1; i <= n; i++) {
	    Event e;
	    e = listReference.getEvent(selectedDate, i);
	    // eventListModel
	    // .addElement(new ListElement(e, retrieveEventString(e)));
	}
    }

    private void init(Component calendarEventsFrame) {
	// wylapywacz daty
	// MyDateListener listener = new MyDateListener();

	// kalendarz
	calendar = new JCalendar(JCalendar.DISPLAY_DATE, false);
	// calendar.addDateListener(listener);
	selectedDate = calendar.getCalendar();
	// ustawienia wygladu kalendarza
	calendar.setTitleFont(new Font("MS Reference Sans Serif", Font.BOLD, 20));
	calendar.setDayOfWeekFont(new Font("MS Reference Sans Serif",
		Font.ITALIC | Font.BOLD, 12));
	calendar.setDayFont(new Font("MS Reference Sans Serif", Font.BOLD, 16));
	// calendar.setBackground(Color.red);
	// calendar.repaint();
	// this.repaint();

	// dodanie kalendarza do okna
	this.add(calendar);
	this.add(calendarEventsFrame);
    }

    /**
     * Metoda zwracaj�ca desktypcj� zdarzenia zawieraj�c� godzin�, opis oraz
     * miejsce
     * 
     * @param e
     * @return deskrypcja zdarzenia
     */
    private String retrieveEventString(Event e) {
	NumberFormat timeFormat = NumberFormat.getInstance();
	timeFormat.setMinimumIntegerDigits(2);
	String ret;
	ret = timeFormat.format(e.getHour()) + ":"
		+ timeFormat.format(e.getMinute()) + "   "
		+ stringCompliment(e.getDescription())
		+ stringCompliment(e.getPlace());
	if (e.isAlarm())
	    if (!coolAlarm)
		ret = ret + " (A)";
	return ret;
    }

    /**
     * Metoda odpowiedzialna na tworzenie g��wnego okna aplikacji. Ustawia
     * w�a�ciwo�ci i layout okna, dodaje menu, ustawia wygl�d kalendarza oraz
     * dodaje go do okna aplikacji, dodaje przyciski oraz list� zdarze� do okna
     */

    public void setCalendarProperties(Color color) {
	this.calendar.setBackground(color);
    }

    public void setEventListColor(Color color) {
	this.eventList.setBackground(color);
    }

    /**
     * Metoda dodaj�ca odpowiedni� ilo�� spacji do podanego napisu
     * 
     * @param s
     *            opis do przetworzenia, do dodania spacji
     * @return przetworzony opis
     */
    private String stringCompliment(String s) {
	String ret;
	ret = s;
	for (int i = 0; i < 22 - s.length(); i++)
	    ret = ret + " ";
	return ret;
    }

	public JMenuItem getAbout() {
		return about;
	}

	public void setAbout(JMenuItem about) {
		this.about = about;
	}

	public JButton getAddEvent() {
		return addEvent;
	}

	public void setAddEvent(JButton addEvent) {
		this.addEvent = addEvent;
	}

	public JCalendar getCalendar() {
		return calendar;
	}

	public void setCalendar(JCalendar calendar) {
		this.calendar = calendar;
	}

	public boolean isCoolAlarm() {
		return coolAlarm;
	}

	public void setCoolAlarm(boolean coolAlarm) {
		this.coolAlarm = coolAlarm;
	}

	public JButton getDelEvent() {
		return delEvent;
	}

	public void setDelEvent(JButton delEvent) {
		this.delEvent = delEvent;
	}

	public JButton getEditEvent() {
		return editEvent;
	}

	public void setEditEvent(JButton editEvent) {
		this.editEvent = editEvent;
	}

	public JList getEventList() {
		return eventList;
	}

	public void setEventList(JList eventList) {
		this.eventList = eventList;
	}

	public DefaultListModel getEventListModel() {
		return eventListModel;
	}

	public void setEventListModel(DefaultListModel eventListModel) {
		this.eventListModel = eventListModel;
	}

	public JMenuItem getExit() {
		return exit;
	}

	public void setExit(JMenuItem exit) {
		this.exit = exit;
	}

	public JMenuItem getExportEvents() {
		return exportEvents;
	}

	public void setExportEvents(JMenuItem exportEvents) {
		this.exportEvents = exportEvents;
	}

	public JMenuItem getFilterEvents() {
		return filterEvents;
	}

	public void setFilterEvents(JMenuItem filterEvents) {
		this.filterEvents = filterEvents;
	}

	public JMenuItem getImportEvents() {
		return importEvents;
	}

	public void setImportEvents(JMenuItem importEvents) {
		this.importEvents = importEvents;
	}

	public EventsList getListReference() {
		return listReference;
	}

	public void setListReference(EventsList listReference) {
		this.listReference = listReference;
	}

	public JMenu getMenu() {
		return menu;
	}

	public void setMenu(JMenu menu) {
		this.menu = menu;
	}

	public JMenuBar getMenuBar() {
		return menuBar;
	}

	public void setMenuBar(JMenuBar menuBar) {
		this.menuBar = menuBar;
	}

	public Calendar getSelectedDate() {
		return selectedDate;
	}

	public void setSelectedDate(Calendar selectedDate) {
		this.selectedDate = selectedDate;
	}

	public JMenuItem getSettings() {
		return settings;
	}

	public void setSettings(JMenuItem settings) {
		this.settings = settings;
	}

	public JMenu getTools() {
		return tools;
	}

	public void setTools(JMenu tools) {
		this.tools = tools;
	}
    
    

}
